package AM;

import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class CatchHeroin_Server extends Thread {

	/**
	 * 서버 작동을 위한 서버소켓 생성
	 */
	ServerSocket ss;

	/**
	 * 접속된 클라이언트 목록
	 */
	ArrayList<CatchHeroin_CopyCilent> connected_client_list;
	
	ArrayList<UserInfo> user_info_list;
	
	int turnIndex;

	/**
	 * 생성자 정의
	 */
	public CatchHeroin_Server() {
		connected_client_list = new ArrayList<>();
		user_info_list = new ArrayList<>();

		try {
			ss = new ServerSocket(3333);
			System.out.println("서버 시작~!");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 입장한 클라이언트 추가
	 */
	public void addCilent() {

	}

	/**
	 * 종료한 클라이언트 삭제
	 * 
	 * @param cc : 삭제할 클라이언트 객체
	 */
	public void delCilent(CatchHeroin_CopyCilent cc) {
		connected_client_list.remove(cc);
	}
	
	/**
	 * 로그인한 사용자 정보 추가
	 * @param uInfo
	 */
	public void addUserInfo(UserInfo uInfo){
		
		user_info_list.add(uInfo);
		
	}
	
	/**
	 * 로그인한 사용자 정보 보낸다
	 * @return
	 */
	public ArrayList<UserInfo> getUserInfoList(){
		return user_info_list;
	}
	
	/**
	 * 종료한 사용자 정보 삭제
	 * @param nickName
	 */
	
	public void delUserInfo(String nickName){
		
		int idx = 0;
		
		for(UserInfo uInfo : user_info_list){
			
			if(nickName.equals(uInfo.getNickName())){
				user_info_list.remove(idx);
				break;
			}
			idx ++;
		}
	}

	/**
	 * 그림/메세지/턴 변경시마다 접속된 모든 클라이언트에게 메세지를 전달
	 * 
	 * @param p : 접속된 클라이언트들에게 전달할 메세지를 담은 객체
	 */
	public void sendMessage(Protocol p) {
		try {
			for (CatchHeroin_CopyCilent cc : connected_client_list) {
				if (cc.isLogin_yn()){
					
					cc.out.writeObject(p);
					
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 접속된 클라이언트 nickName들을 반환 한다.
	 * 
	 * @return : 접속된 클라이언트 nickName 리스트 들
	 */
	public String[] getnickNameList() {
		String[] client_nickname = new String[connected_client_list.size()];
		int i = 0;
		for (CatchHeroin_CopyCilent cc : connected_client_list) {
			client_nickname[i++] = cc.getNickname();
		}
		return client_nickname;

	}
	/**
	 * 서버에 접속하여 로그인 된 사용자 숫자를 반환
	 * @return
	 */
	public int getClientSize(){
		int count = 0;
		for (CatchHeroin_CopyCilent cc : connected_client_list) {
			if (cc.isLogin_yn())
				count++;
		}
		
		return count;
	}

	/**
	 * 클라이언트 받기
	 */
	@Override
	public void run() {
		while (true) {
			try {
				Socket s = ss.accept();
				CatchHeroin_CopyCilent cc = new CatchHeroin_CopyCilent(s, this);

				connected_client_list.add(cc);
				
				cc.start();

			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}

	/**
	 * 서버 시작
	 */
	public static void main(String args[]) {
		new CatchHeroin_Server().start();
	}

}
